Mathematics
Learn Mathematical principles behind our physical world
Updated at 2021.4.27
Fast Fourier Transform
이 글을 수학으로 배우는 파동의 법칙 이라는 책을 읽고 정리하였다. 이전 글에서 유도한 푸리에 변환 공식은 다음과 같다.
\begin{align}G(f) = \int_{-\infty}^{\infty}{f(t)e^{-i 2\pi f t} dt}\end{align}
위 식을 이용하여 실제 음성의 파동을 푸리에 변환하기 위해서는 적분을 무한대로 구간에서 해야 하는데, 현실에서는 그렇게 할 수 없다. 일정 시간 간격으로 유한개의 파동값을 읽어서 사용할 수 밖에 없다.
불연속 푸리에 변환
그 일정 시간 간격을 \(\tau\) 라고 하고, 읽어낸 값의 개수를 \(N\) 이라고 하면, 위의 적분식은 주파수 \(f= \frac{n}{\tau N}\) 일때, 위의 수식은 아래와 같이 쓸 수 있다.
\begin{align}\red{G(\frac{n}{\tau N}) = \sum_{k=0}^{N-1} \lbrace\tau \cdot f(k\tau) e^{-i 2\pi k \frac{n}{\tau N}} \rbrace}\end{align}
위 식을 불연속 푸리에 변환이라고 한다. 위의 식의 문제점은 관찰 구간내에서 최대 \(N/2\) 회 진동하는 파동까지만 계산할 수 있다. (참고로, \(M\) 번 진동하는 파동은 최소 \(2M\) 개의 값을 읽어야 식별 가능 하기 때문임)
예를 들어 0.3초짜리 4000Hz의 음성에서 푸리에 계수 1개를 뽑아내기 위해서는 2400회의 계산이 필요하고
\begin{align}\tau = \frac{0.5}{4000} = 1.25e^{-4}\end{align}
\begin{align}N = \frac{0.3}{\tau} = 2400\end{align}
푸리에 계수를 1Hz부터 4000Hz까지 4000개를 계산하려면, \(2400\times 4000\) 회의 지수함수 및 곱셈 계산이 필요하다.
계산 횟수 줄이기
설명의 편의를 위해 위의 식에서 \(\tau = 1\) 라고 하면,
\begin{align}\red{G(n/N) = \sum_{k=0}^{N-1} f(k) W^{nk}}\end{align}
여기서,
\begin{align}W = e^{ -\frac{i 2\pi}{N}}\end{align}
추가로, \(N = 8\) 라고 하면,
\begin{align}G(n/8) = \sum_{k=0}^{7} f(k) W^{nk}\end{align}
\begin{align}W = e^{ -\frac{i 2\pi}{8}}\end{align}
\(W\) 는 회전 연산자라고 할 수 있는데, \(N= 8\) 일 때는 \(n\) 이 임의의 정수이고, \(0 \le k \lt 8\) 에 대해서 아래와 같음을 알 수 있다.
\begin{align}W^{k + 8n} = W^{k}\end{align}
따라서
\begin{align}\begin{split}G(n/8) &= \sum_{k=0}^{N-1} f(k) W^{nk}\\ &=\sum_{k=0}^{\frac{N}{2}-1} f(2k) W^{n2k} + \sum_{k=0}^{\frac{N}{2}-1} f(2k+1) W^{n(2k+1)}\end{split}\end{align}
추가로 정리하면,
\begin{align}\red{G(n/8) =\sum_{k=0}^{\frac{N}{2}-1} p(k) W^{2nk} + W^n \cdot \sum_{k=0}^{\frac{N}{2}-1} q(k) W^{2nk}}\end{align}
여기서 \(p(k) = f(2k)\), \(q(k) = f(2k+1)\) 이다. 위 식의 장점은 \(G(\frac{4+m}{8})\) 를 계산하고자 할 때 \(G(\frac{m}{8})\) 을 계산할 때 사용한 값을 그대로 사용할 수 있다는 것이다.
즉 64번의 계산량이 짝수일 때 16번, 홀수 일때 16번 + 4번(\(W^n\) 을 곱하는 회수)로 총 34번으로 줄어든다.
유사한 절차를 한번 더 진행하면,
\begin{align}\begin{split}G(n/8) &= \sum_{k=0}^{\frac{N}{4}-1} a(k) W'^{2nk} + W'^n \cdot \sum_{k=0}^{\frac{N}{4}-1} b(k) W'^{2nk}\\ &+ W^n \Big( \sum_{k=0}^{\frac{N}{4}-1} c(k) W'^{2nk} + W'^n \cdot \sum_{k=0}^{\frac{N}{4}-1} d(k) W'^{2nk}\Big) \end{split}\end{align}
여기서 \(a(k) = p(2k)\), \(b(k) = p(2k+1)\), \(c(k) = q(2k)\), \(d(k) = q(2k+1)\), \(W' = W^2\) 이다.
계산회수는 16번에, \(W^n\) 곱하기 회수 4번, \(W'^n\) 곱하기 회수 4번으로 총 24회로 줄어든다.
위와 같은 알고리즘을 활용하여, \(N=8\) 일때는 \(2^3\) 으로 2번의 절차를 통해 회수를 줄였는데, 일반적으로 \(N=1024 = 2^{10}\) 개의 점을 취하면, 9번의 절차를 통해 계산 회수를 획기적으로 줄일 수 있다.
이 알고리즘을 FFT (Fast Fourier Transform)
이라고 한다.
총 21 개의 글이 있습니다.
# | 제목 | 날짜 | 조회수 |
---|---|---|---|
01 | 이항분포와 정규분포 | 2021/04/28 | 152 |
02 | 푸리에 급수 | 2021/04/28 | 332 |
03 | 해석적 확장과 감마 함수 | 2021/05/25 | 112 |
04 | 푸리에 변환 | 2021/05/25 | 268 |
05 | 수학적 증명 방법 | 2021/05/25 | 143 |
06 | 원주율 구하기 | 2021/04/22 | 142 |
07 | 자연상수의 무리수 증명 | 2021/05/25 | 122 |
08 | 스털링 근사 | 2021/05/25 | 172 |
09 | 선형변환 | 2021/04/29 | 145 |
10 | 자연상수와 지수함수 | 2021/04/22 | 136 |
11 | 동전 던지기와 확률 이야기 | 2021/04/28 | 141 |
12 | 수학 분야 | 2021/04/28 | 166 |
13 | 지수함수의 확장 | 2021/04/28 | 132 |
14 | 제타함수 | 2021/05/25 | 137 |
15 | 꼭 알아야 할 수학 기호 | 2021/04/28 | 123 |
16 | 정사영과 직교 | 2021/04/29 | 133 |
17 | 소수의 개수 | 2021/05/25 | 167 |
18 | 수의 기하학적 의미 | 2021/04/28 | 122 |
19 | 허수 | 2021/04/22 | 143 |
20 | 테일러 급수 | 2021/05/25 | 161 |
21 | Fast Fourier Transform | 2021/04/28 | 154 |